/*
 * SearchCollectionTh.java
 * Copyright (c) 2006, FMap
 *
 * Created on 11 de febrero de 2006, 12:26
 */

package fmap.actions.mapF.searchMapF;

import fmap.actions.EvtThread;
import fmap.actions.collection.searchCollection.SearchAdvancedCollectionAction;
import fmap.actions.mapF.InsertMapFResultSearch;
import fmap.dao.MapFDao;
import fmap.model.MapF;
import fmap.model.Node;
import fmap.model.SearchAdvancedModel;
import java.util.Vector;

/**
 * Hilo que busca una cadena de texto en un mapa de ficheros
 *
 * @author  Javier Sanroman Araujo
 * @version $Revision: 1.1
 */
public class SearchAdvancedMapFTh  implements Runnable
{
    // Referencia al receptor unico
    SearchAdvancedCollectionAction miReceptor;

    int ID;
    // Mapa de ficheros sobre el que tenemos que realizar la busqueda
    MapF mapF;
    // Objeto con los datos a buscar
    SearchAdvancedModel searchAdvancedModel;
    
    
    public SearchAdvancedMapFTh ( MapF _mapF, SearchAdvancedModel _searchAdvancedModel, int _ID )
    {
        ID                  = _ID;
        searchAdvancedModel = _searchAdvancedModel;
        mapF  = _mapF;
    }
    
    
    public int getID ()
    {
        return ID;
    }
    
    public MapF getMapFResult ()
    {
        return mapF;
    }
    
    public void run ()
    {
        mapF.setEstado (2); // Esta buscando
        
        if( mapF != null )
        {
            Vector vResult = new Vector();
            // Obtenemos todos los nodos de la BD que coincidan con la cadena a buscar
            if ( searchAdvancedModel.getMayusMinus () )
            {
                vResult      = new fmap.dao.NodeDao ().searchNodesAdvancedCase (mapF.getIdMapF (), searchAdvancedModel );
            }
            else
            {
                vResult      = new fmap.dao.NodeDao ().searchNodesAdvanced (mapF.getIdMapF (), searchAdvancedModel );
            }
            
            
            // Si hemos elegido la opción de filtrado por grupo de ficheros
            // tenemos que filtrarlos aqui
            if( searchAdvancedModel.getGroupFile ().getId () != -1 )
            {
                Vector vResultTmp   = new Vector ();
                
                String extensions = searchAdvancedModel.getGroupFile ().getExtension ();
                
                for( int i=0; i<vResult.size (); i++)
                {
                    Node node = (Node)vResult.get (i);
                    if( node.getType () ==0 )
                    {
                        vResultTmp.add ( node );
                    }
                    else if( node.getType () == 1 )
                    {
                        if( extensions.indexOf ( node.getExtension () ) != -1 ) vResultTmp.add (node);
                    }
                }
                
                vResult = vResultTmp;
            }
            
            
            //------------------------------------------------------------
            
            mapF.setNumResult ( vResult.size () );
            
            // Construimos el arbol de ficheros y lo almacenamos en BD
            new InsertMapFResultSearch ( vResult, mapF );
            
            
            
            // Buscamos en el nombre del mapa de fichero
            //------------------------------------------------------------
            boolean mapFResultSearch = false;
            if ( searchAdvancedModel.getMayusMinus () )     mapFResultSearch = new MapFDao ().searchMapFNameCase ( mapF.getIdMapF (), searchAdvancedModel.getName () );
            else                                            mapFResultSearch = new MapFDao ().searchMapFName ( mapF.getIdMapF (), searchAdvancedModel.getName () );            

            if( mapFResultSearch )
            {
                mapF.setNumResult ( mapF.getNumResult ()+1);
                mapF.setEstado (4); // Finalizo la busqueda y se encontro coincidencia en el nombre o la descripcion del mapa de ficheros
            }
            else
            {
                mapF.setEstado (3); // Finalizo la busqueda
            }
            //------------------------------------------------------------


            if( miReceptor != null)
            {
                miReceptor.finBusqueda ( new EvtThread ( this, ID ) );
            }
        }
        else
        {
            mapF.setError ( true );
            
            if( miReceptor != null)
            {
                miReceptor.finBusqueda ( new EvtThread ( this, ID ) );
            }
        }
    }


    /** Añade un componente listener a esta clase */
    public void addMiEventoListener ( SearchAdvancedCollectionAction receptor )
    {
        // No se permite que intente incorporar mas de un receptor
        if( miReceptor == null )
        {
            miReceptor = receptor;
        }
    }
}
